Cos'è funzione hash?
Funzione Hash
Una funzione hash è una funzione matematica che trasforma un input di dimensione arbitraria (chiamato "messaggio" o "chiave") in un output di dimensione fissa (chiamato "hash value," "hash code," "message digest," o semplicemente "hash").
Le funzioni hash sono ampiamente utilizzate in informatica per diverse finalità, tra cui:
- Tabelle hash: Per implementare strutture dati efficienti per la ricerca, l'inserimento e la cancellazione di dati. In questo contesto, l'hash viene utilizzato per calcolare l'indice di un array in cui memorizzare i dati.
- Crittografia: Per generare impronte digitali (fingerprint) dei dati, utilizzate per la verifica dell'integrità dei dati, l'autenticazione e la memorizzazione sicura delle password.
- Checksum: Per rilevare errori di trasmissione o archiviazione dei dati.
- Ricerca: Per accelerare la ricerca di elementi in grandi insiemi di dati.
Caratteristiche importanti di una funzione hash:
- Determinismo: Per lo stesso input, la funzione hash deve sempre produrre lo stesso output.
- Uniformità: Una buona funzione hash dovrebbe distribuire uniformemente i valori hash generati sull'intervallo di output, riducendo al minimo le collisioni. Una collisione si verifica quando due input diversi producono lo stesso valore hash.
- Efficienza: Il calcolo dell'hash deve essere rapido ed efficiente.
Proprietà desiderabili (soprattutto in contesti crittografici):
- Resistenza alla preimmagine: Dato un valore hash, dovrebbe essere computazionalmente infeasible trovare un input che produca quel valore hash. Questo è anche noto come proprietà "unidirezionale".
- Resistenza alla seconda preimmagine: Dato un input e il suo valore hash, dovrebbe essere computazionalmente infeasible trovare un secondo input diverso che produca lo stesso valore hash.
- Resistenza alle collisioni: Dovrebbe essere computazionalmente infeasible trovare due input diversi che producano lo stesso valore hash. Questa è la proprietà più forte e implica la resistenza alla preimmagine e alla seconda preimmagine.
Esempi di funzioni hash:
Esistono numerosi algoritmi di hash, ognuno con le proprie caratteristiche e compromessi in termini di velocità, sicurezza e resistenza alle collisioni. Alcuni esempi comuni includono:
- MD5: (obsoleto per scopi crittografici a causa di vulnerabilità).
- SHA-1: (obsoleto per scopi crittografici a causa di vulnerabilità).
- SHA-2 (SHA-256, SHA-512, ecc.): Famiglia di funzioni hash ampiamente utilizzate e considerate sicure.
- SHA-3: Un'altra famiglia di funzioni hash progettata per essere una alternativa a SHA-2.
- bcrypt: Una funzione hash progettata specificamente per la memorizzazione sicura delle password.
- Argon2: Un'altra funzione hash moderna progettata per la memorizzazione sicura delle password, con lo scopo di resistere ad attacchi di forza bruta.
La scelta della funzione hash appropriata dipende dall'applicazione specifica e dai requisiti di sicurezza. Per applicazioni crittografiche, è fondamentale utilizzare funzioni hash robuste e resistenti ad attacchi noti. Per applicazioni non crittografiche, come le tabelle hash, la velocità e l'uniformità possono essere più importanti della sicurezza.